package fr.charlott.batch.mapper;

import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.springframework.batch.item.file.mapping.FieldSetMapper;
import org.springframework.batch.item.file.transform.FieldSet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindException;

import com.google.common.base.Splitter;
import com.google.common.collect.Lists;

import fr.charlott.core.repository.model.Adresse;
import fr.charlott.core.repository.model.Hotesse;
import fr.charlott.core.repository.model.Produit;
import fr.charlott.core.repository.model.TailleBas;
import fr.charlott.core.repository.model.TailleHaut;
import fr.charlott.core.service.ProduitService;
import fr.charlott.tools.Constants;

public class HotesseFieldSetMapper implements FieldSetMapper<Hotesse> {

    private static final String FIELD_NOM = "nom";
    private static final String FIELD_PRENOM = "prenom";
    private static final String FIELD_ADRESSE = "adresse";
    private static final String FIELD_CODE_POSTAL = "code_postal";
    private static final String FIELD_VILLE = "ville";
    private static final String FIELD_TELEPHONE = "telephone";
    private static final String FIELD_PORTABLE = "portable";
    private static final String FIELD_EMAIL = "email";
    private static final String FIELD_NAISSANCE = "naissance";
    private static final String FIELD_TAILLE_HAUT = "taille_haut";
    private static final String FIELD_TAILLE_BAS = "taille_bas";
    private static final String FIELD_DERNIERE_VISITE = "derniere_visite";
    private static final String FIELD_COMMENTAIRES = "commentaires";
    private static final String FIELD_PREFERENCES = "preferences";
    private static final String FIELD_ACHATS = "achats";
    private static final String FIELD_PRODUITS = "produits";

    @Autowired
    ProduitService produitService;

    @Override
    public Hotesse mapFieldSet(FieldSet fieldSet) throws BindException {
        Hotesse hotesse = new Hotesse();
        Adresse adresse = new Adresse();

        hotesse.setNom(fieldSet.readString(FIELD_NOM));
        hotesse.setPrenom(fieldSet.readString(FIELD_PRENOM));
        hotesse.setPrenom(fieldSet.readString(FIELD_PRENOM));
        adresse.setNomDeRue(fieldSet.readString(FIELD_ADRESSE));
        adresse.setCodePostal(fieldSet.readString(FIELD_CODE_POSTAL));
        adresse.setVille(fieldSet.readString(FIELD_VILLE));
        adresse.setTelDomicile(fieldSet.readString(FIELD_TELEPHONE));
        adresse.setTelPortable(fieldSet.readString(FIELD_PORTABLE));
        adresse.setEmail(fieldSet.readString(FIELD_EMAIL));
        hotesse.setAdresse(adresse);
        if (StringUtils.isNotEmpty(fieldSet.readString(FIELD_NAISSANCE))) {
            hotesse.setDateDeNaissance(fieldSet.readDate(FIELD_NAISSANCE, Constants.DATE_PATTERN));
        }
        hotesse.setTailleHaut(TailleHaut.getEnumForValue(fieldSet.readString(FIELD_TAILLE_HAUT)));
        hotesse.setTailleBas(TailleBas.getEnumForValue(fieldSet.readString(FIELD_TAILLE_BAS)));
        if (StringUtils.isNotEmpty(fieldSet.readString(FIELD_DERNIERE_VISITE))) {
            hotesse.setDerniereVisite(fieldSet.readDate(FIELD_DERNIERE_VISITE, Constants.DATE_PATTERN));
        }
        hotesse.setCommentaires(fieldSet.readString(FIELD_COMMENTAIRES));
        hotesse.setPreferences(fieldSet.readString(FIELD_PREFERENCES));
        hotesse.setAchats(fieldSet.readString(FIELD_ACHATS));
        List<Produit> produits = Lists.newArrayList();
        Iterable<String> produitsAsString = Splitter.on(",").omitEmptyStrings().trimResults().split(fieldSet.readString(FIELD_PRODUITS));
        for (String produitAsString : produitsAsString) {
            Produit produit = produitService.chercherParReference(produitAsString);
            produits.add(produit);
        }
        hotesse.setProduits(produits);
        return hotesse;
    }

}
